module.exports = (sequelize, DataTypes) => {
    return sequelize.define('User', {
        id: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            primaryKey: true,
            comment: '主键 ID',
        },
        phone: {
            type: DataTypes.STRING(20),
            unique: true,
            allowNull: true,
            comment: '手机号',
        },
        email: {
            type: DataTypes.STRING(255),
            unique: true,
            allowNull: true,
            comment: '邮箱地址',
        },
        password: {
            type: DataTypes.STRING,
            allowNull: true,
            comment: '加密后的密码',
        },
        nickname: {
            type: DataTypes.STRING,
            allowNull: true,
            comment: '用户昵称',
        },
        avatar: {
            type: DataTypes.STRING,
            allowNull: true,
            comment: '头像 URL',
        },
        gender: {
            type: DataTypes.TINYINT,
            allowNull: true,
            defaultValue: 0,
            comment: '性别：0=未知，1=男，2=女',
        },
        birthday: {
            type: DataTypes.DATEONLY,
            allowNull: true,
            comment: '出生日期',
        },
        status: {
            type: DataTypes.INTEGER,
            allowNull: false,
            defaultValue: 1,
            comment: '状态：1=正常，0=禁用/删除',
        },
        role: {
            type: DataTypes.TEXT,
            allowNull: false,
            defaultValue: '["Admin"]',
            comment: '角色数组',
            get() {
                const raw = this.getDataValue('role');
                try {
                    return JSON.parse(raw);
                } catch {
                    return [];
                }
            },
            set(val) {
                this.setDataValue('role', JSON.stringify(val));
            }
        },
        lastLoginAt: {
            type: DataTypes.DATE,
            allowNull: true,
            comment: '最后登录时间',
        },
        loginIp: {
            type: DataTypes.STRING(45),
            allowNull: true,
            comment: '登录 IP 地址',
        },
        loginCount: {
            type: DataTypes.INTEGER,
            allowNull: false,
            defaultValue: 0,
            comment: '登录次数',
        },
        source: {
            type: DataTypes.STRING(50),
            allowNull: true,
            comment: '注册来源，如 wechat/app/h5',
        },
        isVerified: {
            type: DataTypes.BOOLEAN,
            allowNull: false,
            defaultValue: false,
            comment: '是否实名认证',
        },
        idCard: {
            type: DataTypes.STRING(20),
            allowNull: false,
            defaultValue: false,
            comment: '是否实名认证',
        },
        level: {
            type: DataTypes.INTEGER,
            allowNull: false,
            defaultValue: 0,
            comment: '等级'
        },
        ext: {
            type: DataTypes.JSON,
            allowNull: true,
            comment: '扩展信息，支持微信 unionId、标签等',
        },
        openid: {
            type: DataTypes.STRING,
            unique: true,
            allowNull: true,
            comment: '微信 openid',
        }

    }, {
        tableName: 'users',
        timestamps: true, // 自动维护 createdAt、updatedAt 字段
        paranoid: true,   // 启用 deletedAt 软删除
        deletedAt: 'deletedAt', // 软删除字段重命名
        underscored: true, // 开启下划线命名风格
        charset: 'utf8mb4', // 指定字符集
        collate: 'utf8mb4_general_ci', // 使用 utf8mb4 字符集
        comment: '用户表',
    });
};
